package com.obelisco.vista.componentes;

import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import org.apache.commons.beanutils.MethodUtils;

import com.obelisco.vista.plantillas.VentanaListaBase;


public class ListaBase extends VentanaListaBase {

	private Collection items;
	
	private List listaParametrosRealizarBusqueda;

	//private Map<String, String> camposMostrar = new HashMap<String, String>();

	private boolean mostrarIncluir = true;
	
	private boolean mostrarModificar = true;
	
	private boolean mostrarEliminar = true;
	
	private boolean mostrarBuscar = true;
	
	private HashMap parametrosImprimir;
	
	private Vector<ListaBaseListener> listeners = new Vector<ListaBaseListener>();

	
	public ListaBase() {
		super();
		this.getBarraHerramientas().setMostrarSalir(false);
		this.tabla.setSeleccionMultiple(false);		
	}
	
	public void inicializar() {
		super.inicializar();
		if (getRutaArchivoReporte() == null)
		{
			this.getBarraHerramientas().setMostrarImprimir(false);
		}
		if (!mostrarModificar)
		{
			this.getBarraHerramientas().setMostrarModificar(false);
		}
		if (!mostrarEliminar)
		{
			this.getBarraHerramientas().setMostrarEliminar(false);
		}
		if (!mostrarBuscar)
		{
			this.getBarraHerramientas().setMostrarBuscar(false);
		}
		if (!mostrarIncluir)
		{
			this.getBarraHerramientas().setMostrarInlcuir(false);
		}
	}
	
	public void inicializarTabla(Collection items) {
		// TODO Auto-generated method stub
		this.inicializar();
		this.setItems(items);
		this.tabla.setItems(items, camposMostrar,null);
		this.tabla.clearSelection();		
	}

	@Override
	protected void cargarDatos() {
		// TODO Auto-generated method stub
		try {
			TipoAccion accionSeleccionada = (TipoAccion)MethodUtils.invokeMethod(ventanaEmergente, "getAccionSeleccionada", null);
			if (accionSeleccionada == TipoAccion.ACEPTAR) {
				TipoFuncion funcionSeleccionada = (TipoFuncion)MethodUtils.invokeMethod(ventanaEmergente, "getTipoFuncion", null);
				if (funcionSeleccionada == TipoFuncion.INCLUIR) {
					if (items == null) {
						items = new ArrayList();
					}
					else if (!items.contains(MethodUtils.invokeMethod(ventanaEmergente, "getObjetoEntidad", null))) {
						items.add(MethodUtils.invokeMethod(ventanaEmergente, "getObjetoEntidad", null));
					}
				}
			}
		}
		catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
		this.tabla.setItems(items, camposMostrar,null);
	}

	@Override
	public void onEliminacionConfirmada(Object objetos) {
		// TODO Auto-generated method stub
		try {			
			items.remove(objetos);
			tabla.eliminarComponentesFilasSeleccionadas();
			if (objetos instanceof List) {
				this.distribuirEliminarObjetos((List)objetos);
			}
			else {
				this.distribuirEliminarObjeto(objetos);
			}
		} 
		catch (Exception e) {
			DialogoError.mostrar("Error", 0);
			e.printStackTrace();
		}
	}

	@Override
	public void onFuncionPersonalizada(Object objeto, TipoFuncion tipoFuncion,
			String nombre) {
		// TODO Auto-generated method stub
		// En este tipo de Ventana NO se hace Nada
	}

	public Map<String, String> getCamposMostrar() {
		return camposMostrar;
	}

	public void setCamposMostrar(Map<String, String> camposMostrar) {
		this.camposMostrar = camposMostrar;
	}

	public Collection getItems() {
		return items;
	}

	public void setItems(Collection items) {
		this.items = items;
	}
	
	public void limpiarSeleccionTabla(){
		this.tabla.limpiarSeleccionTabla();
	}

	@Override
	protected void cargarDatos(List listaParametrosRealizarBusqueda) {
		this.listaParametrosRealizarBusqueda = listaParametrosRealizarBusqueda;
		this.tabla.setItems(items, camposMostrar,null);
	}

	public boolean isMostrarIncluir() {
		return mostrarIncluir;
	}

	public void setMostrarIncluir(boolean mostrarIncluir) {
		this.mostrarIncluir = mostrarIncluir;
		this.getBarraHerramientas().setMostrarInlcuir(mostrarIncluir);
	}

	public boolean isMostrarBuscar() {
		return mostrarBuscar;
	}

	public void setMostrarBuscar(boolean mostrarBuscar) {
		this.mostrarBuscar = mostrarBuscar;
		this.getBarraHerramientas().setMostrarBuscar(mostrarBuscar);
	}

	public boolean isMostrarModificar() {
		return mostrarModificar;
	}

	public void setMostrarModificar(boolean mostrarModificar) {
		this.mostrarModificar = mostrarModificar;
		this.getBarraHerramientas().setMostrarModificar(mostrarModificar);
	}

	public boolean isMostrarEliminar() {
		return mostrarEliminar;
	}

	public void setMostrarEliminar(boolean mostrarEliminar) {
		this.mostrarEliminar = mostrarEliminar;
		this.getBarraHerramientas().setMostrarEliminar(mostrarEliminar);
	}

	public HashMap getParametrosImprimir() {
		return parametrosImprimir;
	}

	public void setParametrosImprimir(HashMap parametrosImprimir) {
		this.parametrosImprimir = parametrosImprimir;
	}
	
	public void addListaBaseListener(ListaBaseListener listener) {
		listeners.add(listener);
	}

	public void removeListaBaseListener(ListaBaseListener listener) {
		listeners.remove(listener);
	}
	
	public void distribuirEliminarObjeto(Object objeto) {
		for (ListaBaseListener l : listeners) {		
			l.onEliminarObjeto(objeto);
		}
	}
	
	public void distribuirEliminarObjetos(List objetos) {
		for (ListaBaseListener l : listeners) {		
			l.onEliminarObjetos(objetos);
		}
	}
}